#!/bin/bash

#将所有ceph工作目录都设置为ceph用户ceph组
chown_ceph_pwd() {
    chown -R ceph:ceph /var/lib/ceph
    chown -R ceph:ceph /etc/ceph
}

#检查并创建ceph工作目录
mkdir_mon_pwd(){
    #在节点上设置/var/lib/ceph目录及其子文件属主为ceph用户ceph组
    if [ -d /etc/ceph ];then
        mkdir -p /etc/ceph 
    fi
    if [ -d /var/lib/ceph/mon/$Cluster_Name-$MON_NAME ];then
        mkdir -p /var/lib/ceph/mon/$Cluster_Name-$MON_NAME
    fi
    if [ -d /var/lib/ceph/bootstrap-osd ];then
        mkdir -p /var/lib/ceph/bootstrap-osd
    fi
    if [ -d /var/lib/ceph/bootstrap-mon ];then
        mkdir -p /var/lib/ceph/bootstrap-mon
    fi
    if [ -d /var/lib/ceph/bootstrap-mgr ];then
        mkdir -p /var/lib/ceph/bootstrap-mgr
    fi
    if [ -d /var/lib/ceph/bootstrap-mds ];then
        mkdir -p /var/lib/ceph/bootstrap-mds
    fi
    if [ -d /var/lib/ceph/bootstrap-rgw ];then
        mkdir -p /var/lib/ceph/bootstrap-rgw
    fi
    if [ -d /var/lib/ceph/bootstrap-rbd ];then
        mkdir -p /var/lib/ceph/bootstrap-rbd
    fi
    if [ -d /var/lib/ceph/bootstrap-rbd-mirror ];then
        mkdir -p /var/lib/ceph/bootstrap-rbd-mirror
    fi
    if [ -d /var/lib/ceph/mgr ];then
        mkdir -p /var/lib/ceph/mgr
    fi
    if [ -d /var/lib/ceph/mds ];then
        mkdir -p /var/lib/ceph/mds
    fi
    chown_ceph_pwd
}

#仅在第一个mon节点执行
ceph_env_check() {
    #在所有ceph节点上设置/etc/ceph目录及其子文件属主为ceph用户ceph组
    if [ -f /etc/ceph/ceph-cluster.env ];then
        echo "ceph environment file check done"
    else
        if [ -f $Deploy_Path/conf/ceph-cluster.env ];then
            cp -f $Deploy_Path/conf/ceph-cluster.env /etc/ceph/ceph-cluster.env  && chown -R ceph:ceph /etc/ceph
        else
            echo "Error: The ceph environment file $Deploy_Path/conf/ceph-cluster.env is not found!"
            exit 1
        fi
    fi
}

#仅在第一个mon节点执行
ceph_conf_check() {
    #在所有ceph节点上设置/etc/ceph目录及其子文件属主为ceph用户ceph组
    if [ -f /etc/ceph/$Cluster_Name.conf ];then
        echo "ceph configure file check done"
    else
        if [ -f $Deploy_Path/conf/$Cluster_Name.conf ];then
            cp -f $Deploy_Path/conf/$Cluster_Name.conf /etc/ceph/$Cluster_Name.conf  && chown -R ceph:ceph /etc/ceph
        else
            echo "Error: The ceph configure file $Deploy_Path/conf/ceph.conf is not found!"
            exit 1
        fi
    fi
}

#create ceph.conf
modify_ceph_conf() {
    #修改文件中mon_host列表
    MON_HOSTS=$(echo $MON_Nodes|sed 's/[ ]/,/g')
    sed -i 's/^mon_host = .*/mon_host = '"$MON_HOSTS"'/g' /etc/ceph/$Cluster_Name.conf
    echo /etc/ceph/$Cluster_Name.conf
    #修改配置文件中cluster_network的值
    sed -i 's#^cluster_network.*#cluster_network = '"$Cluster_CIDR"'#g' /etc/ceph/$Cluster_Name.conf
    echo /etc/ceph/$Cluster_Name.conf
    #修改配置文件中public_network的值
    sed -i 's#^public_network.*#public_network = '"$Public_CIDR"'#g' /etc/ceph/$Cluster_Name.conf
    #生成ceph集群fsid,并在ceph.conf配置文件中修改集群fsid为当前生成的fsid
    FSID=`uuidgen`
    sed -i 's/^fsid.*/fsid = '"$FSID"'/g' /etc/ceph/$Cluster_Name.conf
    sed -i 's/^auth_client_required.*/auth_client_required = '"$Auth_Mode"'/g' /etc/ceph/$Cluster_Name.conf
    sed -i 's/^auth_cluster_required.*/auth_cluster_required = '"$Auth_Mode"'/g' /etc/ceph/$Cluster_Name.conf
    sed -i 's/^auth_service_required.*/auth_service_required = '"$Auth_Mode"'/g' /etc/ceph/$Cluster_Name.conf
    echo /etc/ceph/$Cluster_Name.conf
}

#仅在第一个mon节点执行
#创建keyring，注意ceph-authtool --create-keyring命令用于离线创建keyring，mon服务初始化之前必须使用该命令创建离线mon.用户的keyring，用于后面通过ceph-mon mkfs命令将mon.用户离线keyring文件导入mon的rocksdb数据库中，如果mon服务初始化完成，再创建新的keyring一般使用ceph auth get-or-create命令或者通过ceph-authtool --create-keyring创建离线keyring后再使用ceph auth add 命令导入mon数据库。
create_mon_keyring() {
    #-----create mon. keyring------#
    #创建一个用户名为 mon. 的mon初始化(bootstrap)keyring，并赋予其mon的所有操作权限，相当于client.bootstrap-osd的keyring，用于创建mon节点时以此用户身份为新的mon节点创建keyring
    if [ -f /var/lib/ceph/bootstrap-mon/$Cluster_Name.mon.keyring ];then
        ceph-authtool --create-keyring /var/lib/ceph/bootstrap-mon/$Cluster_Name.mon.keyring --gen-key -n mon. --cap mon 'allow *'
    fi
}

create_client_admin_keyring(){
    #-----create client.admin keyring------#
    #创建一个用户名为 client.admin 的keyring，此为client类型admin用户，用于用户管理整个ceph存储集群使用，赋予该用户ceph平台所有组件的client端的所有操作权限，使用--cap指定ceph组件名称，'allow *'代表允许所有操作
    if [ -f /etc/ceph/$Cluster_Name.client.admin.keyring ];then
        ceph-authtool --create-keyring /etc/ceph/$Cluster_Name.client.admin.keyring --gen-key -n client.admin  --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
    fi
}

create_osd_bootstrap_keyring(){
    #-----create osd bootstrap keyring------#
    #创建一个用户名为 client.bootstrap-osd 的keyring，此用户为osd的初始化用户，用于创建osd时以此用户身份为新的osd进程创建keyring，此身份拥有mon服务关于osd boostrap相关操作的权限
    if [ /var/lib/ceph/bootstrap-osd/$Cluster_Name.keyring ];then
        ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/$Cluster_Name.keyring --gen-key -n client.bootstrap-osd --cap  mon 'profile bootstrap-osd'
    fi
}

import_to_mon_keyring(){
    #-----合并client.admin和bootstrap-osd两个用户的权限到ceph.mon.keyring--------#
    #将ceph.client.admin.keyring和bootstrap-osd用户的ceph.keyring都导入ceph.mon.keyring中，使ceph.mon.keyring拥有bootstrap-osd与client.admin等用户的密钥
    ceph-authtool /var/lib/ceph/bootstrap-mon/$Cluster_Name.mon.keyring --import-keyring /etc/ceph/$Cluster_Name.client.admin.keyring
    ceph-authtool /var/lib/ceph/bootstrap-mon/$Cluster_Name.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/$Cluster_Name.keyring
    cp -f /var/lib/ceph/bootstrap-osd/$Cluster_Name.keyring /etc/ceph/ && chown -R ceph:ceph /etc/ceph

}
set_node_mon_lables(){}
set_node_osd_lables(){}
set_node_mgr_lables(){}
set_node_mds_lables(){}
set_node_rgw_lables(){}
set_node_labels(){}
create_cm_ceph_env(){}
create_cm_ceph_conf(){}
create_cm_ceph_mon_bootstrap_keyring(){}
create_cm_ceph_client_admin_keyring(){}
create_cm_ceph_osd_bootstrap_keyring(){}

init_ceph_deploy_env(){
    mkdir_mon_pwd
    #判断当前节点是否为第一个mon节点，如果是则执行mon首节点初始化函数，否则执行mon扩容节点函数
    #echo $Node_FQDN|grep -w $Deploy_Node
    if [ "$Node_FQDN"x == "$Deploy_Node"x ];then
        ceph_env_check
        ceph_conf_check
        modify_ceph_conf
        create_mon_keyring
        create_client_admin_keyring
        create_osd_bootstrap_keyring
        import_to_mon_keyring
        if [ "$Deploy_Mode"x == k8sx ];then
            create_cm_ceph_env
            create_cm_ceph_conf
            create_cm_ceph_mon_bootstrap_keyring
            create_cm_ceph_client_admin_keyring
            create_cm_ceph_osd_bootstrap_keyring
        fi
    fi
    #create_monmap
    chown_ceph_pwd
}

init_ceph_deploy_env
